//给定一个字符串 s 和一个非空字符串 p，找到 s 中所有是 p 的字母异位词的子串，返回这些子串的起始索引。 
//
// 字符串只包含小写英文字母，并且字符串 s 和 p 的长度都不超过 20100。 
//
// 说明： 
//
// 
// 字母异位词指字母相同，但排列不同的字符串。 
// 不考虑答案输出的顺序。 
// 
//
// 示例 1: 
//
// 
//输入:
//s: "cbaebabacd" p: "abc"
//
//输出:
//[0, 6]
//
//解释:
//起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。
//起始索引等于 6 的子串是 "bac", 它是 "abc" 的字母异位词。
// 
//
// 示例 2: 
//
// 
//输入:
//s: "abab" p: "ab"
//
//输出:
//[0, 1, 2]
//
//解释:
//起始索引等于 0 的子串是 "ab", 它是 "ab" 的字母异位词。
//起始索引等于 1 的子串是 "ba", 它是 "ab" 的字母异位词。
//起始索引等于 2 的子串是 "ab", 它是 "ab" 的字母异位词。
// 
// Related Topics 哈希表 
// 👍 421 👎 0


package com.yun.leetcode.editor.cn;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class FindAllAnagramsInAString {
    public static void main(String[] args) {
        Solution solution = new FindAllAnagramsInAString().new Solution();
        System.out.println(solution.findAnagrams("aa", "bb"));
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public List<Integer> findAnagrams(String s, String p) {
            List<Integer> resultList = new ArrayList<>();
            // 找到s中，p的所有排列
            HashMap<Character, Integer> need = new HashMap<>();
            int needLen = p.length();
            char[] chs = p.toCharArray();
            for (char ch : chs) {
                need.put(ch, need.getOrDefault(ch, 0) + 1);
            }
            HashMap<Character, Integer> win = new HashMap<>();
            char[] chars = s.toCharArray();
            int left = 0;
            int right = 0;
            while (right < chars.length) {
                char c = chars[right];
                win.put(c, win.getOrDefault(c, 0) + 1);
                right++;

                if (right - left >= needLen) {
                    if (need.entrySet().stream().allMatch(e -> win.getOrDefault(e.getKey(), 0) >= e.getValue())) {
                        resultList.add(left);
                    }
                    // 没有使用，左侧缩进去一个
                    win.put(chars[left], win.get(chars[left]) - 1);
                    left++;
                }

            }
            return resultList;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}